import main from '../main';
interface HasPermissionProps {
  /* 要验证的权限 */
  permission: string | string[];
  /* 验证模式 or=>有一个存在就通过  and=>全部存在才通过 */
  mode?: 'or' | 'and';
  children: any;
}

interface HasRoleProps {
  /* 要验证的角色 */
  role: string | string[];
  /* 验证模式 or=>有一个存在就通过  and=>全部存在才通过 */
  mode?: 'or' | 'and';
  children: any;
}

/**
 * 权限检查标签
 * @param permission string | string[] 要检查的权限
 * @param mode 'or' | 'and' 验证模式   or=>有一个存在就通过  and=>全部存在才通过 默认为or
 */
export function HasPermission({ permission, mode = 'or', children }: HasPermissionProps) {
  let hasAbility = checkPermission(permission, mode);
  return hasAbility ? children : null;
}

/**
 * 角色检查标签
 * @param role string | string[] 要检查的角色
 * @param mode 'or' | 'and' 验证模式   or=>有一个存在就通过  and=>全部存在才通过 默认为or
 */
export function HasRole({ role, mode = 'or', children }: HasRoleProps) {
  let hasAbility = checkRole(role, mode);
  return hasAbility ? children : null;
}

/**
 * 权限检查
 * - 如果传入的权限为空 直接通过
 * - 如果已有权限中包含admin权限，直接通过
 * @param permission string | string[] 要检查的权限
 * @param mode or | and 检查模式
 * - `mode`=or 如果传入的权限有任意一项存在，直接通过
 * - `mode`=and 如果传入的权限有任意一项不存在，直接失败
 */
export function checkPermission(permission: string | string[], mode: 'or' | 'and' = 'or') {
  const abilities = main.permissions ?? [];
  let userAbilities: string[] = [];
  if (!permission) return true;
  if (typeof permission === 'string') {
    userAbilities = permission.length <= 0 ? [] : [permission];
  } else {
    userAbilities = permission || [];
  }
  if (abilities.includes(adminAbility) || userAbilities.length <= 0) return true;
  if (mode === 'or') {
    // 有任何一个存在 返回true
    return userAbilities.some((i) => abilities.includes(i));
  } else if (mode === 'and') {
    // 有任何一个不存在 返回false
    return !userAbilities.some((i) => !abilities.includes(i));
  }
  // 以上验证都不过 直接失败
  return false;
}

/**
 * 角色检查
 * - 如果传入的角色为空 直接通过
 * @param role string | string[] 要检查的角色
 * @param mode string or 如果传入的角色有任意一项存在，直接通过  and 如果传入的角色有任意一项不存在，不通过
 */
export function checkRole(role: string | string[], mode: 'or' | 'and' = 'or') {
  const roles = main.roles ?? [];
  let userRoles: string[] = [];
  if (!role) return true;
  if (typeof role === 'string') {
    userRoles = role.length <= 0 ? [] : [role];
  } else {
    userRoles = role || [];
  }
  if (userRoles.length <= 0) return true;
  if (mode === 'or') {
    // 有任何一个存在 返回true
    return userRoles.some((i) => roles.includes(i));
  } else if (mode === 'and') {
    // 有任何一个不存在 返回false
    return !userRoles.some((i) => !roles.includes(i));
  }
  // 以上验证都不过 直接失败
  return false;
}

//总管理员权限
const adminAbility = '*:*:*';
// 总管理员角色
const adminRole = 'admin';
// 代理商角色
const agentShopRole = 'agent_shop';
/**
 * 检查是否是代理角色
 */
export function isAgentShop() {
  return checkRole(agentShopRole);
}

/**
 * 检查是否是admin角色
 */
export function isAdmin() {
  return checkRole(adminRole);
}
